www.gusucode.com > VC++使用XOR 256算法对文件进行加密解密-源码程序 > VC++使用XOR 256算法对文件进行加密解密-源码程序/code/HexEnc_src/HexEncView.cpp

    // HexEncView.cpp : implementation of the CHexView class
// Download by http://www.NewXing.com

#include "stdafx.h"
#include "HexEnc.h"

#include "HexEncDoc.h"
#include "HexEncView.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CHexView

IMPLEMENT_DYNCREATE(CHexView, CView)

BEGIN_MESSAGE_MAP(CHexView, CView)
	//{{AFX_MSG_MAP(CHexView)
	ON_WM_CREATE()
	ON_WM_VSCROLL()
	ON_WM_SIZE()
	ON_WM_KEYDOWN()
	ON_WM_MOUSEWHEEL()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CHexView construction/destruction

CHexView::CHexView()
{
	// TODO: add construction code here
}

CHexView::~CHexView()
{
}

BOOL CHexView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs
	cs.style |= WS_VSCROLL;

	return CView::PreCreateWindow(cs);
}

/////////////////////////////////////////////////////////////////////////////
// CHexView drawing

void CHexView::OnDraw(CDC* pDC)
{
	CHexDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
	if (m_nLinesTotal != 0) {
        CRect rect;
        GetClientRect(&rect);

        UINT nStart = m_nVScrollPos / m_cyScreen;
        UINT nEnd = min (m_nLinesTotal,
						 nStart + (rect.bottom + m_cyScreen - 1) / m_cyScreen);

        CFont* pOldFont = pDC->SelectObject (&m_fontScreen);
        for (UINT i=nStart; i<=nEnd; i++) {
            CString string;
            FormatLine (pDoc, i, string);
            pDC->TextOut (2, ((i - nStart) * m_cyScreen) + 2, string);
        }
        pDC->SelectObject (pOldFont);
    }

}

/////////////////////////////////////////////////////////////////////////////
// CHexView diagnostics

#ifdef _DEBUG
void CHexView::AssertValid() const
{
	CView::AssertValid();
}

void CHexView::Dump(CDumpContext& dc) const
{
	CView::Dump(dc);
}

CHexDoc* CHexView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CHexDoc)));
	return (CHexDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CHexView message handlers

void CHexView::OnInitialUpdate() 
{
	CView::OnInitialUpdate();
	
	// TODO: Add your specialized code here and/or call the base class
	UINT nDocLength = GetDocument()->GetDocumentLength();
	m_nLinesTotal = (nDocLength + 15) / 16;

	UINT nVScrollMax = 0;
	m_nVScrollPos = 0;

	CRect rect;
	GetClientRect(&rect);
	m_nVPageSize = rect.bottom - rect.top;

	if(m_nVPageSize < (m_nLinesTotal * m_cyScreen))
	{
		nVScrollMax = m_nLinesTotal * m_cyScreen - 1;
		m_nVScrollPos = min(m_nVScrollPos, nVScrollMax - m_nVPageSize);
	}

	SCROLLINFO si;
	si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
	si.nMin = 0;
	si.nMax = nVScrollMax;
	si.nPos = m_nVScrollPos;
	si.nPage = m_nVPageSize;

	SetScrollInfo(SB_VERT, &si, TRUE);

	if(si.nMax == si.nMin)
		m_bScrollBar = FALSE;
	else
		m_bScrollBar = TRUE;
}

int CHexView::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CView::OnCreate(lpCreateStruct) == -1)
		return -1;
	m_bScrollBar = FALSE;
	m_fontScreen.CreatePointFont(100, _T("Courier New"));
	
	CClientDC dc(this);
	TEXTMETRIC tm;
	CFont* pOldFont = dc.SelectObject(&m_fontScreen);
	dc.GetTextMetrics(&tm);
	m_cyScreen = tm.tmHeight + tm.tmExternalLeading;
	dc.SelectObject(pOldFont);
	return 0;
}

void CHexView::FormatLine(CHexDoc* pDoc, UINT nLine, CString& string)
{
    //
    // Get 16 bytes and format them for output.
    //
    BYTE b[17];
    ::FillMemory (b, 16, 32);
    UINT nCount = pDoc->GetBytes (nLine * 16, 16, b);

    string.Format (_T ("%0.8X    %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X " \
        "%0.2X %0.2X - %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X %0.2X " \
        "%0.2X    "), nLine * 16,
        b[0], b[1],  b[2],  b[3],  b[4],  b[5],  b[6],  b[7],
        b[8], b[9], b[10], b[11], b[12], b[13], b[14], b[15]);

    //
    // Replace non-printable characters with periods.
    //
    for (UINT i=0; i<nCount; i++) {
        if (!::IsCharAlphaNumeric (b[i]))
            b[i] = 0x2E;
    }

    //
    // If less than 16 bytes were retrieved, erase to the end of the line.
    //
    b[nCount] = 0;
    string += b;

    if (nCount < 16) {
        UINT pos1 = 59;
        UINT pos2 = 60;
        UINT j = 16 - nCount;

        for (i=0; i<j; i++) {
            string.SetAt (pos1, _T (' '));
            string.SetAt (pos2, _T (' '));
            pos1 -= 3;
            pos2 -= 3;
            if (pos1 == 35) {
                string.SetAt (35, _T (' '));
                string.SetAt (36, _T (' '));
                pos1 = 33;
                pos2 = 34;
            }
        }
    }
}


void CHexView::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) 
{
	// TODO: Add your message handler code here and/or call default
	int nDelta;

    switch (nSBCode) {

    case SB_LINEUP:
        nDelta = -(int)m_cyScreen;
        break;

    case SB_PAGEUP:
        nDelta = -(int)m_nVPageSize;
        break;

    case SB_THUMBTRACK:
        nDelta = (int)nPos - (int)m_nVScrollPos;
        break;

    case SB_PAGEDOWN:
        nDelta = (int)m_nVPageSize;
        break;

    case SB_LINEDOWN:
        nDelta = (int)m_cyScreen;
        break;

    default: // Ignore other scroll bar messages
        return;
    }

    int nScrollPos = m_nVScrollPos + nDelta;
    UINT nMaxPos = m_nLinesTotal * m_cyScreen - m_nVPageSize + m_cyScreen * 2;

    if (nScrollPos < 0)
        nDelta = -(int)m_nVScrollPos;
    else if (nScrollPos > (int)nMaxPos)
        nDelta = (int)nMaxPos - (int)m_nVScrollPos;

    if (nDelta != 0) {
        m_nVScrollPos += nDelta;
        SetScrollPos (SB_VERT, m_nVScrollPos, TRUE);
        ScrollWindow (0, -nDelta);
    }

	CView::OnVScroll(nSBCode, nPos, pScrollBar);
}

void CHexView::OnSize(UINT nType, int cx, int cy) 
{
	CView::OnSize(nType, cx, cy);
	
	// TODO: Add your message handler code here
	UINT nVScrollMax = 0;

	m_nVScrollPos = 0;
	m_nVPageSize = cy;

	if(m_nVPageSize < (m_nLinesTotal * m_cyScreen))
	{
		nVScrollMax = m_nLinesTotal * m_cyScreen - 1;
		m_nVScrollPos = min(m_nVScrollPos, nVScrollMax - m_nVPageSize);
	}

	SCROLLINFO si;
	si.fMask = SIF_PAGE | SIF_RANGE | SIF_POS;
	si.nMin = 0;
	si.nMax = nVScrollMax;
	si.nPos = m_nVScrollPos;
	si.nPage = m_nVPageSize;

	SetScrollInfo(SB_VERT, &si, TRUE);

	if(si.nMax == si.nMin)
		m_bScrollBar = FALSE;
	else
		m_bScrollBar = TRUE;
}

void CHexView::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags) 
{
	// TODO: Add your message handler code here and/or call default
	if(!m_bScrollBar)
		return;
	
	SCROLLINFO si;

	switch(nChar) {
	case VK_UP:
		OnVScroll(SB_LINEUP, 0, GetScrollBarCtrl(SB_VERT));
		break;

	case VK_DOWN:
		OnVScroll(SB_LINEDOWN, 0, GetScrollBarCtrl(SB_VERT));
		break;

	case VK_PRIOR:
		OnVScroll(SB_PAGEUP, 0, GetScrollBarCtrl(SB_VERT));
		break;

	case VK_NEXT:
		OnVScroll(SB_PAGEDOWN, 0, GetScrollBarCtrl(SB_VERT));
		break;
	case VK_HOME:
		m_nVScrollPos = 0;
		si.fMask = SIF_POS;
		si.nPos = m_nVScrollPos;
		SetScrollInfo(SB_VERT, &si, TRUE);
		RedrawWindow();
		break;
	case VK_END:
		m_nVScrollPos = m_nLinesTotal * m_cyScreen - m_nVPageSize + m_cyScreen * 2 ;
		si.fMask = SIF_POS;
		si.nPos = m_nVScrollPos;
		SetScrollInfo(SB_VERT, &si, TRUE);
		RedrawWindow();
		break;
	}	

	CView::OnKeyDown(nChar, nRepCnt, nFlags);
}

BOOL CHexView::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) 
{
	// TODO: Add your message handler code here and/or call default
	if(!m_bScrollBar)
		return FALSE;

	BOOL bUp = TRUE;
    int nDelta = zDelta;

    if (zDelta < 0) {
        bUp = FALSE;
        nDelta = -nDelta;
    }

    UINT nWheelScrollLines;
    ::SystemParametersInfo (SPI_GETWHEELSCROLLLINES, 0,
        &nWheelScrollLines, 0);

    if (nWheelScrollLines == WHEEL_PAGESCROLL) {
        SendMessage (WM_VSCROLL,
            MAKEWPARAM (bUp ? SB_PAGEUP : SB_PAGEDOWN, 0), 0);
    }
    else {
        int nLines = (nDelta * nWheelScrollLines) / WHEEL_DELTA;
        while (nLines--)
            SendMessage (WM_VSCROLL,
                MAKEWPARAM (bUp ? SB_LINEUP : SB_LINEDOWN, 0), 0);
    }
	
	return CView::OnMouseWheel(nFlags, zDelta, pt);
}